<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- 点击按钮弹出警告'你别点我' -->
     <input type="button" value="click" onclick="(function(userName){alert(userName+'你别点我');})('张三')"/>
    
</body>
<script>

    //函数表达式：把函数定义直接赋值给一个变量
        let f1 =function add(){
            console.log("hello world");
        };
    //调用：变量名();
    f1();
    //带参数的函数表达式
        let f2  = function add(a,b){
            console.log(a+b);
    };
        f2(1,2);//3
        console.log(f2(5,6));//未定义

    //有返回值的函数表达式
        let f3 =function add(a,b){
            return a+b;
        };
        //let res=f3(3,4);
        //  console.log(res);
        console.log(f3(3,4));//7
    //匿名函数：没有函数名字
    let myf1 =function(){
        console.log('hello myf1');
    };
    myf1();
    let myf2 = function(a,b){
        return a<b?a:b;//三元运算符：真的输出a，反之输出b
    };
    console.log(myf2(-8,0));
    //函数表达式注意问题：一定要先声明函数，然后正再调用函数。

    //立即执行函数：把函数的声明看作一个整体，声明结束立即调用。匿名自调用函数
        (function(){
            console.log('hello world');
        })();
        (function(a,b){
            console.log(a-b);
        })(10,6);
        console.log('----------')
        console.log(function(){
            return 0;
        }());
        
        let a = function(){
            console.log('hello');

        };
        console.log(typeof a);//function,数组：object
        console.log('-----------');
        //把函数作为参数传给另一个函数
        //把函数a作为参数传递给函数b，并在函数b中调用函数a,把a称作回调函数。
        let arg1 =function(){
            return 0;
        };
        console.log(arg1);

        let fun =function(a,b){
            console.log(b*a());
        }
        fun(arg1,8888);
        //递归函数：把函数作为参数传给函数本身。调用函数本身。
        //注意:递归函数容易造成死循环。
        //阶乘：10！=10*9*8*...*1 > 10*9! > 10*9*(8!) >...
    /* let arg2 =function(a){
            return 0;
        }
        let arg3 = function(fn){
            return fn();
        }
        arg3(arg3);*/
        let jc = function(n){
            if(n === 1){
                return 1;
            }else{
                return n*jc(n-1);
            }
        }
        console.log(jc(10));
</script>
</html>